﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using SAAC.DTO;
using System.Data;

namespace SAAC.DAL
{
	public class UsuarioDAL : DALBase
	{
		
		public UsuarioDTO Select(UsuarioDTO dto, string order = null)
		{
			try
			{
				string sql = "CALL sp_usuario_sel(@id,@login,@senha,@tipoUsuarioId,@order,@limit);";

				if (dto.TipoUsuario == null) dto.TipoUsuario = new TipoUsuarioDTO();

				MySqlCommand cmd = new MySqlCommand(sql, con);
				cmd.Parameters.AddWithValue("@id", dto.Id);
				cmd.Parameters.AddWithValue("@login", dto.Login);
				cmd.Parameters.AddWithValue("@senha", dto.Senha);
				cmd.Parameters.AddWithValue("@tipoUsuarioId", dto.TipoUsuario.Id);
				cmd.Parameters.AddWithValue("@order", order);
				cmd.Parameters.AddWithValue("@limit", 1);

				con.Open();
				MySqlDataReader dr;

				dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

				if (dr.Read())
				{
					dto.Id = Convert.ToInt32(dr["idUsuario"]);
					dto.Login = dr["login"].ToString();
					dto.Senha = dr["senha"].ToString();
					dto.TipoUsuario.Id = Convert.ToInt32(dr["tipoUsuario_idTipoUsuario"]);
				}
				else dto = null;

				return dto;
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public List<UsuarioDTO> SelectAll(UsuarioDTO dto, string order = null, int limit = 1000)
		{
			try
			{
				string sql = "CALL sp_usuario_sel(@id,@login,@senha,@tipoUsuarioId,@order,@limit);";

				var lista = new List<UsuarioDTO>();
				MySqlCommand cmd = new MySqlCommand(sql, con);
				cmd.Parameters.AddWithValue("@id", dto.Id);
				cmd.Parameters.AddWithValue("@login", dto.Login);
				cmd.Parameters.AddWithValue("@senha", dto.Senha);
				cmd.Parameters.AddWithValue("@tipoUsuarioId", dto.TipoUsuario.Id);
				cmd.Parameters.AddWithValue("@order", order);
				cmd.Parameters.AddWithValue("@limit", limit);

				con.Open();
				MySqlDataReader dr;

				dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

				while (dr.Read())
				{
					var item = new UsuarioDTO();
					item.Id = Convert.ToInt32(dr["idCurso"]);
					item.Login = dr["login"].ToString();
					item.Senha = dr["senha"].ToString();
					item.TipoUsuario.Id = Convert.ToInt32(dr["TipoUsuario_idTipoUsuario"]);
					lista.Add(item);
				}

				return lista;
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public void Insert(UsuarioDTO dto)
		{
			try
			{
				String sql = @"CALL sp_usuario_ins(@login,@senha,@tipoUsuarioId);";

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@login", dto.Login);
				cmd.Parameters.AddWithValue("@senha", dto.Senha);
				cmd.Parameters.AddWithValue("@tipoUsuarioId", dto.TipoUsuario.Id);

				con.Open();
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public void Update(UsuarioDTO dto)
		{
			try
			{
				String sql = "CALL sp_usuario_upd(@id,@login,@senha,@tipoUsuarioId);";

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@id", dto.Id);
				cmd.Parameters.AddWithValue("@login", dto.Login);
				cmd.Parameters.AddWithValue("@senha", dto.Senha);
				cmd.Parameters.AddWithValue("@tipoUsuarioId", dto.TipoUsuario.Id);

				con.Open();
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}

		public void Delete(UsuarioDTO dto)
		{
			try
			{
				String sql = "CALL sp_usuario_del(@id);";

				MySqlCommand cmd = new MySqlCommand(sql, con);

				cmd.Parameters.AddWithValue("@id", dto.Id);
				con.Open();
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				con.Close();
			}
		}
	}
}
